#include <iostream>
#include <signal.h>
#include <unistd.h> // getpid

// 当前如果正在对2号信号进行处理，默认2号信号会被自动屏蔽
// 对2号信号处理完成的时候，会自动解除对2号信号的屏蔽

// 就是禁止同一个信号被递归似的处理

void Print(sigset_t &pending)
{
    for (int sig = 31; sig > 0; sig--)
    {
        if (sigismember(&pending, sig)) // 检测特定对应的信号是否在pending集中
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << std::endl;
}

void handler(int signum)
{
    std::cout << "get a sig: " << signum << std::endl;
    while (true)
    {
        sigset_t pending;
        sigpending(&pending);

        Print(pending);

        sleep(1);
    }

    // exit(1);
}

int main()
{
    struct sigaction act, oact;

    act.sa_handler = handler;

    sigemptyset(&act.sa_mask); // 信号集置零
    // 如果想在处理2号信号的时候同时对其他信号进行屏蔽, 以3为例
    // sigaddset(&act.sa_mask,3);

    act.sa_flags = 0;

    sigaction(SIGINT, &act, &oact); // 处理SIGINT信号

    while (true)
    {
        std::cout << "I am a procsss, pid: " << getpid() << std::endl;
        sleep(1);
    }

    return 0;
}